package com.ccnu.JobHub.controller;

import com.alibaba.dashscope.aigc.generation.Generation;
import com.alibaba.dashscope.aigc.generation.GenerationParam;
import com.alibaba.dashscope.aigc.generation.GenerationResult;
import com.alibaba.dashscope.common.Message;
import com.alibaba.dashscope.common.Role;
import com.alibaba.dashscope.exception.ApiException;
import com.alibaba.dashscope.exception.InputRequiredException;
import com.alibaba.dashscope.exception.NoApiKeyException;
import com.ccnu.JobHub.model.common.Result;
import com.ccnu.JobHub.model.request.AiRequest;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;

import java.util.ArrayList;
import java.util.List;

@RestController
@RequestMapping("ai")
@CrossOrigin("*")
@Slf4j
public class AiController {

    public static List<Message> messages = new ArrayList<>();

    public AiController() {
        messages.add(createMessage(Role.SYSTEM, "你是启航站的帖子生成助手，可以帮助用户按照他们的想法生成对应的帖子"));
    }
    /**
     * 根据消息列表创建生成参数对象
     * 该方法用于初始化模型生成参数，特别是用于设置API密钥、模型名称、消息列表和结果格式
     *
     * @param messages 消息列表，包含与模型交互的所有消息
     * @return 返回一个配置好的GenerationParam对象，用于模型生成
     */
    public static GenerationParam createGenerationParam(List<Message> messages) {
        return GenerationParam.builder()
                // 若没有配置环境变量，请用百炼API Key将下行替换为：.apiKey("sk-xxx")
                .apiKey("sk-844e682f13bf4c638a71807c6aaadad5")
                .model("qwen-plus")
                .messages(messages)
                .resultFormat(GenerationParam.ResultFormat.MESSAGE)
                .build();
    }
    /**
     * 使用提供的参数通过消息调用生成功能
     * 此方法封装了Generation对象的创建和调用过程，简化了外部调用
     *
     * @param param 生成参数，包含所有必要的信息以执行生成任务
     * @return GenerationResult对象，包含生成任务的结果
     * @throws ApiException 当API调用失败时抛出
     * @throws NoApiKeyException 当检测到没有API密钥时抛出
     * @throws InputRequiredException 当必要的输入参数缺失时抛出
     */
    public static GenerationResult callGenerationWithMessages(GenerationParam param) throws ApiException, NoApiKeyException, InputRequiredException {
        // 创建Generation对象，用于执行生成任务
        Generation gen = new Generation();
        // 调用Generation对象的call方法，传入参数并返回结果
        return gen.call(param);
    }
    public static Result useAi(String userInput) {
        try {
                messages.add(createMessage(Role.USER, userInput));
                GenerationParam param = createGenerationParam(messages);
                GenerationResult result = callGenerationWithMessages(param);
                System.out.println(result.getOutput().getChoices().get(0).getMessage().getContent());

                messages.add(result.getOutput().getChoices().get(0).getMessage());
                return Result.success("success",result.getOutput().getChoices().get(0).getMessage().getContent());

        } catch (ApiException | NoApiKeyException | InputRequiredException e) {
            log.error(e.getMessage());
            return Result.error("获取ai回复错误");
        }

    }

    /**
     * 构建一个信息
     * @param role 角色
     * @param content 内容
     * @return message对象
     */
    private static Message createMessage(Role role, String content) {
        return Message.builder().role(role.getValue()).content(content).build();
    }

    /**
     * 使用ai接口
     * @param aiRequest ai请求
     * @return 返回一个result对象
     */
    @PostMapping("useAi")
    public Result ai(@RequestBody AiRequest aiRequest) {
        log.info("--------------------ai请求--------------------");
        return useAi(aiRequest.getUserInput());
    }
}
